[小ネタ]心当たりのないログイン通知があったのでSnowflakeでのログイン履歴を探る
データアナリティクス事業本部インテグレーション部コンサルティングチーム・新納(にいの)です。
先日、Snowflakeへログインした記憶がなかったのに、MFA設定をしたDUOアプリから「Snowflakeへのアクセスが求められているからApproveしてくれ!」と通知が来ました。もちろん心当たりが無いのでドキドキしながら通知を拒否し、慌ててSnowflakeへのログインパスワードを変更しました。
こういう不気味な体験をすると、誰がアクセスしようとしていたのか知りたくなりますよね。本エントリではSnowflakeへのログイン試行履歴の確認方法をご紹介します。
(SnowflakeへのMFA認証の設定については以下エントリをご参照ください)
LOGIN_HISTORYを確認する
クエリを発行する
Snowflakeアカウントのオブジェクトメタデータなどを保持するACCOUNT_USAGEスキーマの中に、過去365日間以内のSnowflakeユーザーによるログイン試行の履歴を保持するLOGIN_HISTORY
ビューがあります。
ビューの参照にはACCOUNTADMIN
ロールが必要です。
今回発行したクエリは以下の通り。ログインに失敗したレコードに絞って表示しています。なお、EVENT_TIMESTAMP
はデフォルトでタイムゾーンがUTCなのでAsia/Tokyoに変更しています。
USE ROLE ACCOUNTADMIN; SELECT EVENT_ID, CONVERT_TIMEZONE('Asia/Tokyo',EVENT_TIMESTAMP) AS JST_EVENT_TIMESTAMP, EVENT_TYPE, USER_NAME, CLIENT_IP, REPORTED_CLIENT_TYPE, REPORTED_CLIENT_VERSION, FIRST_AUTHENTICATION_FACTOR, SECOND_AUTHENTICATION_FACTOR, IS_SUCCESS, ERROR_CODE, ERROR_MESSAGE, RELATED_EVENT_ID, CONNECTION FROM SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY WHERE USER_NAME = 'ユーザー名' AND IS_SUCCESS = 'NO' ORDER BY EVENT_TIMESTAMP DESC ;
結果
上述のクエリを実行すると以下のように表示されます。特にみておきたいカラムをかいつまんで説明します。そのほかのカラムや詳細については以下をご参照ください。
項目 | 内容 |
---|---|
EVENT_TIMESTAMP | ログイン試行した時間(デフォルトでUTC) |
CLIENT_IP | リクエスト発信元のIP アドレス |
REPORTED_CLIENT_TYPE | Snowflakeへアクセスした経路(以下は一例)SNOWFLAKE_UI : SnowflakeのWebブラウザODBC_DRIVER : ODBCドライバ経由JDBC_DRIVER : JDBCドライバ経由 |
ERROR_MESSAGE | リクエスト失敗のエラーメッセージ。MFAのPush通知で拒否にした履歴はEXT_AUTHN_DENIED となります |
結果に表示されたclient_ip
をnslookupしてみたりdigしてみたりして、どういったリクエスト発信元なのか探ってみましょう。
おわりに
特にSnowflakeでACCOUNTADMINロールを持っているようなユーザーの場合、MFA認証は設定しておくと安心です。不審なログイン通知があれば通知からログインを拒否し、パスワードを変更しておきましょう。私の場合、今回の心当たりのないリクエストの正体は社内の検証用BIサーバーからのアクセスでした。不審なアクセスじゃなくて一安心です。